/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control.servlet;

import control.Connection;
import control.UserDAO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import model.InvalidValueException;
import model.Pages;
import model.User;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileUploadException;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import utils.DateUtils;

/**
 *
 * @author fred
 */
public class EditUser extends HttpServlet {

    private boolean checkParameter(String parameter) {
        return (parameter != null) && (!parameter.equals(""));
    }

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        HttpSession session = request.getSession();

        String name         = request.getParameter("name");
        String email        = request.getParameter("email");
        String birthDateStr = request.getParameter("birthDate");

        if (!checkParameter(name) || !checkParameter(email) || !checkParameter(birthDateStr)) {
            session.setAttribute("message", "The modification has not been "
                    + "successfully accomplished!<br />Please check the "
                    + "informations and try again.");
            response.sendRedirect("index.jsp?op=" + Pages.EDITPROFILE);
        } else {
            try {
                User user = null;
                Object obj = session.getAttribute("user");
                if (obj != null) {
                    user = (User) obj;
                
                    user.setName(name);
                    user.setEmail(email);
                    Date birthDate = new SimpleDateFormat(DateUtils.dateFormat).parse(birthDateStr);
                    user.setBirthDate(birthDate);

                    // Tries to upload picture
                    uploadPicture(request, user.getLogin());

                    // Tries to apply changes to database
                    Connection con = new Connection();
                    UserDAO userDAO = new UserDAO(con);

                    // Logs the user in if the registration was sucessfully
                    if (userDAO.editUser(user)) {
                        session.setAttribute("message", "Edition completed succesfully");
                        response.sendRedirect("index.jsp?op=" + Pages.PROFILE);
                    }
                    else {
                        session.setAttribute("message", "User could not be edited");
                        response.sendRedirect("index.jsp?op=" + Pages.EDITPROFILE);
                    }
                }
                else {
                    response.sendRedirect("index.jsp?op=" + Pages.HOME);
                }
            } catch (FileUploadException ex) {
                session.setAttribute("message", "Problem uploading user picture "
                        + "with following message: " + ex.getMessage());
                response.sendRedirect("index.jsp?op=" + Pages.EDITPROFILE);
            } catch (ClassNotFoundException ex) {
                session.setAttribute("message", "Problem accessing the database "
                        + "with following message: " + ex.getMessage());
                response.sendRedirect("index.jsp?op=" + Pages.EDITPROFILE);
            } catch (SQLException ex) {
                session.setAttribute("message", "Problem accessing the database "
                        + "with following message: " + ex.getMessage());
                response.sendRedirect("index.jsp?op=" + Pages.EDITPROFILE);
            } catch (ParseException ex) {
                session.setAttribute("message", "Invalid date. It must be in the"
                        + " format \"" + DateUtils.dateFormat + "\"");
                response.sendRedirect("index.jsp?op=" + Pages.EDITPROFILE);
            } catch (InvalidValueException ex) {
                session.setAttribute("message", ex.getMessage());
                response.sendRedirect("index.jsp?op=" + Pages.EDITPROFILE);
            }
        }
    }
    
    private File uploadPicture(HttpServletRequest request, String fileName) 
            throws FileUploadException, IOException {
        boolean podeRecuperar = ServletFileUpload.isMultipartContent(request);
        //se for um multiparte
        if (podeRecuperar) {
            DiskFileItemFactory factory = new DiskFileItemFactory();

            ServletFileUpload upload = new ServletFileUpload(factory);
            
            List parseRequest = upload.parseRequest(request);
            for (Object a : parseRequest) {
                FileItem Fils = (FileItem) a;
                if (!Fils.isFormField() && !Fils.getName().equals("")) {
                    // Checks image type
                    if (!Fils.getContentType().equals("image/jpeg"))
                        throw new FileUploadException("Image type must be jpeg");
                    
                    // Creates user file
                    File directory = new File(User.IMAGE_PATH);
                    if (!directory.exists())
                        directory.mkdirs();
                    File file = new File(directory, fileName + ".jpg");
                    if (!file.exists())
                        file.createNewFile();

                    FileOutputStream fos = new FileOutputStream(file);
                    InputStream is = Fils.getInputStream();

                    byte[] buffer = new byte[2048];
                    int nLidos;
                    while ((nLidos = is.read(buffer)) >= 0)
                        fos.write(buffer, 0, nLidos);

                    fos.flush();
                    fos.close();
                    is.close();

                    return file;
                }
            }

        }
        return null;
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
